iT邦幫忙

2022 iThome 鐵人賽

DAY 16
0
Modern Web

使用 Vue 3 從 0 到 1 架設網站!!!系列 第 16

使用 Deno 建立資料庫 migration 檔

  • 分享至 

  • xImage
  •  

由於後續要做註冊及登入,所以呢,今天先來將註冊登入會用到的資料庫 migration 檔建立起來。

什麼是 migration 及 seed 檔

一般來說,在建立資料庫的 Schema 時,一種最簡單的方式,就是直接進到資料庫手動建立,看起來方便,但其實不好,原因是因為下次若要再重新建立的時候,會不知道之前建立的步驟,所以會有重建上的麻煩。

所以 migration 檔的好處:將資料庫 schema 寫在程式裡,這樣之後要重建的話,直接執行指令即可。
另外也可以有 seed 檔案,可以透過程式的方式,直接埋入資料。

以下就讓我們透過 Docker 的方式,所以需先進到 container 容器裡,然後在 webmix_api 資料夾下,建立 migration 檔及 seed 檔。

使用 nessie 套件

該套件的官網在這

在 webmix_api 資料夾下,執行以下指令,來自動建立設定檔及資料夾:

deno run -A --unstable https://deno.land/x/nessie/cli.ts init --dialect mysql

執行完之後,會產生 nessie.config.ts 設定檔,然後裡面的資料庫資訊需做更改,完成的原始碼如下:

import {
    ClientMySQL,
    NessieConfig,
} from "https://deno.land/x/nessie@2.0.7/mod.ts";

const client = new ClientMySQL({
    hostname: Deno.env.get("HOSTNAME"),
    port: parseInt(Deno.env.get("PORT")),
    username: Deno.env.get("USERNAME"),
    password: Deno.env.get("DB_PASSWORD"),
    db: Deno.env.get("DB"),
});

/** This is the final config object */
const config: NessieConfig = {
    client,
    migrationFolders: ["./db/migrations"],
    seedFolders: ["./db/seeds"],
};

export default config;

除了設定檔之外,也會自動產生 db 資料夾,該資料夾裡,會有 migrations 資料夾及 seeds 資料夾。

接下來就是執行產生 migration 檔的指令及 seed 檔的指令。

建立及執行 migration 檔

deno run -A --unstable https://deno.land/x/nessie/cli.ts make:migration create_users

然後就會在 migrations 資料夾下,自動產生 20220916042119_create_users.ts 檔案,然後該檔案裡面呢,我們就寫些 sql,完整原始碼如下:

import { AbstractMigration, Info, ClientMySQL } from "https://deno.land/x/nessie@2.0.7/mod.ts";

export default class extends AbstractMigration<ClientMySQL> {
    /** Runs on migrate */
    async up(info: Info): Promise<void> {
      await this.client.query("CREATE TABLE roles(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,role_name varchar(10))");
      await this.client.query(
        `
          CREATE TABLE users(
            id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
            role_id INT NOT NULL,
            nickname VARCHAR(20),
            email VARCHAR(10),
            password VARCHAR(255),
            created_at TIMESTAMP,
            CONSTRAINT roles_role_id_fk FOREIGN KEY (role_id) REFERENCES roles (id)
          )
        `);
    }

    /** Runs on rollback */
    async down(info: Info): Promise<void> {
      await this.client.query("DROP TABLE users");
      await this.client.query("DROP TABLE roles");
    }
}

從上述的程式碼來看,其實就是建立 rolesusers 兩個資料表而已。

然後該怎麼執行呢,執行以下 migrate 指令即可:

deno run -A --unstable https://deno.land/x/nessie/cli.ts migrate

然後就可以到資料庫中,看資料庫是否有建立對應的資料表(roles 和 users)囉。

如果想復原,那就執行以下的 rollback 指令:

deno run -A --unstable https://deno.land/x/nessie/cli.ts rollback

建立及執行 seed 檔

建立 seed 檔,執行以下指令:

deno run -A --unstable https://deno.land/x/nessie/cli.ts make:seed add_roles

那麼就會在 seeds 資料夾下,自動產生 add_roles.ts 檔案,那該檔裡的程式呢,我們就是加上 sql 來做新增資料,原始碼如下:

import { AbstractSeed, Info, ClientMySQL } from "https://deno.land/x/nessie@2.0.7/mod.ts";

export default class extends AbstractSeed<ClientMySQL> {
    /** Runs on seed */
    async run(info: Info): Promise<void> {
      await this.client.query("INSERT INTO roles(id, role_name) VALUES (1, '管理者')");
      await this.client.query("INSERT INTO roles(id, role_name) VALUES (2, '一般會員')");
    }
}

那麼要如何執行 seed 檔呢,執行以下指令即可:

deno run -A --unstable https://deno.land/x/nessie/cli.ts seed add_roles.ts

然後就可以到資料庫中,看 roles 資料表,是否有建立對應的資料囉。

結語

資料庫建立好了基本的 schema,而且是透過 migration 來建立,以後就方便做資料庫的移轉或重建。
後續就可以來寫註冊會員的 GraphQL API 了。


上一篇
Deno 程式讀取環境設定檔 .env
下一篇
註冊的 GraphQL API,密碼使用 bcrypt 雜湊加密(with salt)
系列文
使用 Vue 3 從 0 到 1 架設網站!!!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言